//package com.ztom.agent.report;
//
//import com.google.common.collect.Queues;
//import com.ztom.agent.log.Logger;
//
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.List;
//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.LinkedBlockingQueue;
//import java.util.concurrent.TimeUnit;
//
///**
// * @author ZhangTao
// */
//public class MessageQueue {
//    /**
//     * 队列长度
//     */
//    private static final int SIZE = 5000;
//    /**
//     * 一次批量取的最大值
//     */
//    private static final int BATCH_FETCH_ITEM_COUNT = 200;
//    /**
//     * 最大等待时间, 单位: 秒
//     */
//    private static final int MAX_WAIT_TIMEOUT = 30;
//    /**
//     * 有序阻塞队列
//     */
//    private BlockingQueue<Record> queue = new LinkedBlockingQueue<>(SIZE);
//
//    private MessageQueue() {
//    }
//
//    public int availableSize() {
//        return queue.remainingCapacity();
//    }
//
//    private static class SingletonHolder {
//        private static MessageQueue helper = new MessageQueue();
//    }
//
//    public static MessageQueue getInstance() {
//        return SingletonHolder.helper;
//    }
//
//    public boolean add(final Record logItem) {
//        return queue.offer(logItem);
//    }
//
//    public List<Record> drain() {
//        List<Record> bulkData = new ArrayList<>();
//        try {
//            Queues.drain(queue, bulkData, BATCH_FETCH_ITEM_COUNT, MAX_WAIT_TIMEOUT, TimeUnit.SECONDS);
//        } catch (InterruptedException e) {
//            Logger.error("MessageQueue.drain()", e);
//        }
//        return bulkData;
//    }
//
//    public List<Record> batchGet() throws InterruptedException {
//        List<Record> bulkData = new ArrayList<>();
//        int num = batchGet(queue, bulkData, BATCH_FETCH_ITEM_COUNT, MAX_WAIT_TIMEOUT, TimeUnit.SECONDS);
//        Logger.debug("MessageQueue.batchGet(): num=" + num);
//        return bulkData;
//    }
//
//    private  <E> int batchGet(BlockingQueue<E> q, Collection<? super E> buffer, int numElements, long timeout, TimeUnit unit) throws InterruptedException {
//        long deadline = System.nanoTime() + unit.toNanos(timeout);
//        int added = 0;
//        while (added < numElements) {
//            // drainTo非常高效, 我们先尝试批量取, 能取多少是多少, 不够的poll来凑
//            added += q.drainTo(buffer, numElements - added);
//            if (added < numElements) {
//                E e = q.poll(deadline - System.nanoTime(), TimeUnit.NANOSECONDS);
//                if (e == null) {
//                    break;
//                }
//                buffer.add(e);
//                added++;
//            }
//        }
//        return added;
//    }
//}
